// 1.	正确理解题意
// 2.	配置typescript开发环境，初始化typescript开发项目
// 3.	使用typescript语法完成题目要求
// 4.	正确定义时间戳计算函数，声明函数的返回值，参数类型

// 时间
function time(times: number): string {
	const currTime = new Date().getTime()
	// 5.	正确计算出给定时间戳距当前时间的距离
	const t = new Date(times - currTime - 8 * 60 * 60 * 1000)
	const days = t.getDate() - 1
	const hours = t.getHours()
	const minute = t.getMinutes()

	// 6.	对于距离当前时间为复数的，单位上添加s
	if (days) {
		return days > 1 ? `${days}days` : `${days}day`
	} else if (hours) {
		return hours > 1 ? `${hours}hours` : `${hours}hour`
	}

	return minute > 1 ? `${minute}minutes` : `${minute}minute`
}

console.log(time(new Date(2022, 1, 23, 12, 0, 0).getTime()));



interface ObjType {
	[propsName: string]: any
}

// 深度克隆
// 7.	正确定义引用类型深拷贝函数，声明函数的返回值
// 8.	声明深拷贝函数的参数类型，对于不确定的参数考虑索引类型
function deepClone(params: any[] | ObjType): any[] | ObjType {
	// 10.	判断深拷贝的对象不能为null
	if (typeof params !== 'object' || params === null) {
		return params
	}
	// 9.	实现数组和对象的区分，数组使用数组的深拷贝方法，对象使用对象的深拷贝方法
	// 11.	判断内部属性是数组或对象的，使用递归调用拷贝
	if (Array.isArray(params)) {
		const newArr: any[] = []
		params.forEach((v, i) => {
			// 递归调用拷贝
			newArr.push(deepClone(v))
		})

		return newArr
	} else {
		const obj: ObjType = {};
		Object.keys(params).forEach((key: string, i) => {
			// 递归调用拷贝
			obj[key] = deepClone(params[key])
		})
		return obj
	}
}

const arr = [{ name: '张三' }]
const deepArr = deepClone(arr)

arr.push({ name: '哈哈' })

console.log(arr);
console.log(deepArr);

















// 13.	flattenByDeep返回值为数组，使用联合类型定义数组项
// 14.	实现flattenByDeep的函数功能
// 15.	测试flattenByDeep满足案例1
// 16.	测试flattenByDeep满足案例2
// 17.	测试flattenByDeep满足案例3

// interface ArrType {
// 	[propsName: number]: number | ArrType
// }

// const testArr: ArrType = [1, 2, 3, 4, 5, [1, 2, 3, 4, [4, 5, 6]]]

// 12.	声明数组扁平化方法，指定参数类型和返回值类型

function flat(arr: any[]): any[] {
	const newArr: any[] = []
	function fn(arrItem: any[]) {
		arrItem.forEach(v => {
			if (Array.isArray(v)) {
				fn(v)
			} else {
				newArr.push(v)
			}
		})
	}

	fn(arr)
	return newArr
}

const f1 = flat([1, [2, [3]]])
const f2 = flat([{}, true, '123', [new Date(), 2, 2, [3, [4], [5]]]])

console.log(f1);
console.log(f2);

